package com.java.base.exercise;

import java.sql.Time;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * @Author RenPu
 * @Date 2021/9/27 11:13
 * @Version 1.0
 * @Description: 运用场景：
 * 1：排队场景，
 * 2：资源有限的房间，
 * 3：资源有限的群，常见的实际应用场景：线程池，连接池等
 * 模拟10个请求并发请求，使用信号量每次只能三个请求，可以去执行相应的操作
 **/
public class SemaphoreDemo {

    public static void main(String[] args) {

        //设置只有三请求获取许可证
        final Semaphore semaphore = new Semaphore(3);

        for (int i = 0; i < 10; i++) {

            int finalI = i;
            Runnable runnable = new Runnable() {
                int no = finalI;

                @Override
                public void run() {
                    try {
                        System.out.println("用户编码为：" + no + "连接上了");
                        TimeUnit.SECONDS.sleep(3);
                        semaphore.acquire();//获取到许可证，去执行相应的任务
                        System.out.println("用户编码为：" + no + "开始执行任务****&&&&&&&&");
                        TimeUnit.SECONDS.sleep(2);
                        semaphore.release();  //归还许可证到semaphore对象
                        System.out.println("用户编码为：" + no + "任务执行完毕。。。。。@@@@@@@");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };

            new Thread(runnable).start();
        }

        System.out.println("Main  Thread  end !!!  ");

    }
}
